package org.example.strategy;

import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
import org.example.enums.BizCodeEnum;
import org.example.exception.BizException;

import java.util.Collection;

/**
 * @description: 分表策略
 * @author: 谢超
 * @date: 2023/8/16 17:50
 */
@Slf4j
public class CustomTablePreciseShardingAlgorithm implements PreciseShardingAlgorithm<String> {

    /**
     * @param availableTargetNames 数据源集合
     *                             在分库时值为所有分片库的集合 databaseNames
     *                             分表时为对应分片库中所有分片表的集合 tablesNames
     * @param shardingValue        分片属性，包括 logicTableName 为逻辑表
     *                             columnName 分片健（字段）
     *                             value 为从 SQL 中解析出的分片健的值
     * @return
     */

    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {

        // 获取逻辑表名
        String targetName = availableTargetNames.iterator().next();

        // 短链码
        String codeValue = shardingValue.getValue();

        // 获取短链码最后一位
        String codeSuffix = codeValue.substring(codeValue.length() - 1);

        // 将逻辑表和短链码最后一位拼接为真实表
        return targetName + "_" + codeSuffix;
    }
}
